package chapter05

/**
  * 练习1：定义一个匿名函数并将它作为值赋给fun,函数有3个参数类型分别为Int，String，Char，返回值类型为Boolean，
  * 要求调用函数fun(0,"",'0')得到返回值为false,其他情况返回true
  *
  * 练习2:定义一个函数func，它接收一个Int类型的参数，返回一个函数（记作f1)。
  * 它返回的函数f1，接收一个string类型的参数，同样返回一个函数（(记作2)。
  * 函数2接收一个Char类型的参数，返回一个Boolean的值。
  * 要求调用函数func(0)("")(O')得到返回值为false，其它情况均返回true。
  */
object Test08_Practice {

  def main(args: Array[String]): Unit = {
    //1.练习1
    val fun: (Int, String, Char) => Boolean = (i: Int, s: String, c: Char) => {
      if (i == 0 && s == "" && c == '0') false else true
    }
    println(fun(0, "", '0'))
    println(fun(0, "", '1'))

    println("--------------------------")

    //2.练习2
    def func(i: Int): String => (Char => Boolean) = {
      def f1(s: String): Char => Boolean = {
        def f2(c: Char): Boolean = {
          if (i == 0 && s == "" && c == '0') false else true
        }

        f2
      }

      f1
    }

    println(func(0)("")('0'))
    println(func(0)("")('1'))
    println(func(22)("")('0'))
    println("--------------------------")

    // 2.2匿名函数简写
    def func2(i: Int): String => Char => Boolean = {
      s => c => if (i == 0 && s == "" && c == '0') false else true
    }

    println(func2(0)("")('0'))
    println(func2(0)("")('1'))
    println(func2(22)("")('0'))
    println("--------------------------")

    // 2.3 柯里化简写
    def fun3(i:Int)(s:String)(c:Char):Boolean ={
     if (i == 0 && s == "" && c == '0') false else true
    }
    println(fun3(0)("")('0'))
    println(fun3(0)("")('1'))
    println(fun3(22)("")('0'))
  }
}
